package com.example.wuyou.juc;


import java.util.LinkedList;
import java.util.Random;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class CJThread implements Runnable {
    private static final Lock lock = new ReentrantLock();
    static LinkedList<Integer> list = new LinkedList<>();

    static {
        list.add(10);
        list.add(5);
        list.add(20);
        list.add(50);
        list.add(100);
        list.add(200);
        list.add(500);
        list.add(800);
        list.add(2);
        list.add(80);
        list.add(300);
        list.add(700);
    }

    // 每个线程的计数器和累加器
    private int count = 0;
    private int sum = 0;
    private int max = 0;

    @Override
    public void run() {
        Random random = new Random(); // 将Random实例移到外面，避免重复创建

        while (true) {
            Integer randomElement = null;

            synchronized (lock) {
                if (!list.isEmpty()) {
                    // 获取列表的大小
                    int size = list.size();
                    // 生成一个介于0（包括）和size（不包括）之间的随机整数
                    int randomIndex = random.nextInt(size);
                    // 使用随机索引获取随机元素
                    randomElement = list.get(randomIndex);

                    // 立即移除元素，并释放锁
                    list.remove(randomIndex); // 注意这里用的是索引，不是元素本身
                }
            }

            if (randomElement != null) {
                System.out.println("窗口" + Thread.currentThread().getName() + "抽中了" + randomElement);
                count++;
                sum += randomElement;
                if(randomElement>max){
                    max=randomElement;
                }
            } else {
                // 如果在获取锁之后发现列表为空，则打印信息并退出循环
                break; // 或者你可以选择让线程等待或进行其他处理
            }
        }

        // 打印结果
        System.out.println("线程" + Thread.currentThread().getName() + "总共取出了 " + count + " 个数字，和为: " + sum);
    }

    // 提供一个方法来获取线程的结果，如果需要的话
    public int getCount() {
        return count;
    }

    public int getSum() {
        return sum;
    }
    public int getMax() {
        return max;
    }
}

